package org.convallaria.system.biz.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.convallaria.infrastruct.db.entity.BaseEntity;

import java.io.Serial;

/**
 * 系统参数配置实体类
 * 
 * 功能特性：
 * - 支持系统参数配置管理
 * - 支持多租户数据隔离
 * - 支持软删除机制
 * - 支持乐观锁并发控制
 * - 支持数据审计追踪
 * - 支持系统内置和用户自定义配置区分
 * 
 * 业务说明：
 * - 参数配置是系统运行的基础组件
 * - 支持系统内置配置和用户自定义配置
 * - 配置键名在同一租户内必须唯一
 * - 支持配置的启用和停用状态控制
 * - 支持配置值的动态修改和热更新
 * 
 * 配置类型：
 * - 系统内置配置：系统预定义的配置项，通常不允许删除
 * - 用户自定义配置：用户根据业务需要创建的配置项
 * 
 * 关联关系：
 * - 与租户表：多对一关系，通过tenant_id关联
 * 
 * 数据约束：
 * - config_name：配置名称，必填
 * - config_key：配置键名，在同一租户内唯一，必填
 * - config_value：配置键值，可以为空
 * - config_type：配置类型，Y=系统内置，N=用户自定义
 * 
 * @author convallaria
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_config")
public class SysConfig extends BaseEntity {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 参数主键
     * 主键，自增长
     */
    @TableId("config_id")
    private Long configId;

    /**
     * 参数名称
     * 配置项显示名称，必填字段
     */
    @TableField("config_name")
    private String configName;

    /**
     * 参数键名
     * 配置项唯一标识，在同一租户内必须唯一
     * 用于程序中的配置项识别和访问
     */
    @TableField("config_key")
    private String configKey;

    /**
     * 参数键值
     * 配置项的具体值，支持字符串类型
     * 可以为空，支持动态修改
     */
    @TableField("config_value")
    private String configValue;

    /**
     * 系统内置标识
     * Y=系统内置配置，N=用户自定义配置
     * 系统内置配置通常不允许删除
     */
    @TableField("config_type")
    private String configType;

    /**
     * 租户ID
     * 多租户数据隔离标识
     */
    @TableField("tenant_id")
    private Long tenantId;
}
